home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
PROGRAM
/
ULARN.ARJ
/
ULARN.TAR
/
ularn
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-10-25
|
26KB
|
1,254 lines
/* main.c */
/* This game is bad for you. It is evil. It will rot your brain. */
#include "header.h"
static char copyright[]=
"\nUlarn was created by Phil Cordier and is based on Larn by Noah Morgan\n";
int srcount=0; /* line counter for showstr() */
int dropflag=0; /* if 1 then don't lookforobject() next round */
int rmst=80; /* random monster creation counter */
int userid; /* the players login user id number */
int stayflag=0;
char nowelcome=0,
nomove=0; /* if (nomove) then don't count next iteration as a move */
static char viewflag=0;
/* if viewflag then we have done a 99 stay here and
don't showcell in the main loop */
char restorflag=0; /* 1 means restore has been done */
static char cmdhelp[] = "\
Cmd line format: Ularn [-slicnh] [-o<optsfile>] [-##] [++]\n\
-s show the scoreboard\n\
-i show scoreboard with inventories\n\
-c create new scoreboard (wizard only)\n\
-n suppress welcome message on starting game\n\
-h print this help text\n\
-o<optsfile> specify .Ularnopts file to be used instead of \"~/.Ularnopts\"\n\
-## specify level of difficulty (example: Ularn -5)\n\
-++ restore game checkpoint file\n";
/*
************
MAIN PROGRAM
************
*/
main(argc,argv)
int argc;
char **argv;
{
register int i;
int hard;
char *ptr=0;
struct passwd *pwe,*getpwuid();
init_term(); /*setup the terminal (find out what type) for termcap */
/*
* first task is to identify the player
*/
if ((ptr = getlogin()) == NULL)
if (pwe=getpwuid(geteuid()))
ptr = pwe->pw_name;
else if ((ptr = getenv("USER")) == NULL) {
noone: fprintf(stderr, "Can't find your logname. Who Are You?\n");
fflush(stderr);
exit(1);
}
if (ptr==NULL) goto noone;
if (strlen(ptr)==0) goto noone;
/*
* second task is to prepare the pathnames the player will need
*/
strcpy(loginname,ptr);
/* save loginname of the user for logging purposes */
strcpy(logname,ptr);
/* this will be overwritten with the players name */
if ((ptr = getenv("HOME")) == NULL)
if ((ptr = pwe->pw_dir) == NULL)
ptr = ".";
/* save file name in home directory */
strcpy(savefilename, ptr);
strcat(savefilename, "/Ularn.sav");
sprintf(optsfile, "%s/.Ularnopts",ptr); /* the .Ularnopts filename */
strcat(scorefile, SCORENAME); /* the Ularn scoreboard filename */
strcat(logfile, LOGFNAME);
/* Ularn activity logging filename */
strcat(helpfile, HELPNAME); /* the Ularn on-line help file */
strcat(larnlevels, LEVELSNAME); /* the pre-made cave level data file */
strcat(fortfile, FORTSNAME); /* the fortune data file name */
/*
* now malloc the memory for the dungeon
*/
cell = (struct cel *)malloc(sizeof(struct cel)*(MAXLEVEL+MAXVLEVEL)*MAXX*MAXY);
if (cell == (struct cel *)NULL)
died(-285); /* malloc failure */
if ( ( lpbuf = malloc ((5* BUFBIG)>>2) ) == (char *)NULL)
died(-285);
if ( ( inbuffer = malloc( (5*MAXIBUF) >>2) ) == (char *)NULL)
died(-285);
lcreat((char*)0);
newgame(); /* set the initial clock */
hard= -1;
/*
* now make scoreboard if it is not there (don't clear)
*/
if (access(scorefile,0) == -1) /* not there */
makeboard();
/*
* now process the command line arguments
*/
for (i=1; i<argc; i++) {
if (argv[i][0] == '-')
switch(argv[i][1]) {
case 's': showscores();
exit(0); /* show scoreboard */
case 'i': showallscores();
exit(0); /* show all scoreboard */
case 'c': /*anyone with password can create scoreboard*/
setupvt100();
lprcat("Preparing to initialize the scoreboard.\n");
if (getpassword() != 0) {
makeboard();
showscores();
}
exit(0);
case 'n': nowelcome=1;
argv[i][0]=0;
break;
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9': /* for hardness */
sscanf(&argv[i][1],"%d",&hard);
if (hard > 100) hard = 100;
break;
case 'h': /* print out command line arguments */
fprintf(stderr, "%s", cmdhelp);
fflush(stderr);
exit(0);
case 'o': /* specify a .Ularnopts filename */
strncpy(optsfile,argv[i]+2,127); break;
default:
fprintf(stderr,"Unknown option <%s>\n",argv[i]);
fprintf(stderr,"%s", cmdhelp);
fflush(stderr);
exit(1);
};
if (argv[i][0] == '+') {
clear(); restorflag = 1;
if (argv[i][1] == '+') {
hitflag=1;
restoregame(ckpfile);
/* restore checkpointed game */
}
i = argc;
}
}
userid = geteuid(); /* obtain the user's effective id number */
sigsetup(); /* trap all needed signals */
sethard(hard); /* set up the desired difficulty */
setupvt100(); /* setup the terminal special mode */
readopts(); /* read the options file if there is one */
/* restore game if need to */
if (access(savefilename,0)==0) {
clear();
restorflag = 1;
hitflag=1;
restoregame(savefilename);
}
/* create new game */
if (c[HP]==0) {
makeplayer(); /* make the character that will play*/
newcavelevel(0);/* make the dungeon */
predostuff = 1;
/* tell signals that we are in the welcome screen */
if (nowelcome==0)
welcome(); /* welcome the player to the game */
}
drawscreen(); /* show the initial dungeon */
/* tell the trap functions that they must do a showplayer()
from here on */
predostuff = 2;
yrepcount = hit2flag = 0;
/*
* M A I N L O O P
*/
while (1) {
if (dropflag==0)
lookforobject(); /* see if there is an object here*/
else
dropflag=0; /* don't show it just dropped an item */
if (hitflag==0) {
if (c[HASTEMONST])
movemonst();
movemonst();
} /* move the monsters */
if (viewflag==0)
showcell(playerx,playery);
else viewflag=0; /* show stuff around player */
if (hit3flag)
flushall();
hitflag = hit3flag = 0;
nomove=1;
bot_linex(); /* update bottom line */
while (nomove)/* get commands and make moves */
{
if (hit3flag)
flushall();
nomove=0;
parse();
}
regen(); /* regenerate hp and spells*/
if (c[TIMESTOP]==0)
if (--rmst <= 0) {
rmst = 120-(level<<2);
fillmonst(makemonst(level));
}
} /* end main loop */
} /* end main */
/*
showstr()
show character's inventory
*/
showstr()
{
register int i,number;
for (number=3, i=0; i<26; i++)
if (iven[i]) number++; /* count items in inventory */
t_setup(number);
qshowstr();
t_endup(number);
}
qshowstr()
{
register int k,sigsav;
srcount=0;
sigsav=nosignal;
nosignal=1; /* don't allow ^c etc */
if (c[GOLD]) {
lprintf(".) %d gold pieces",(long)c[GOLD]);
srcount++;
}
for (k=0; k<=26; k++)
if (iven[k]) show3(k);
lprintf("\nElapsed time is %d. You have %d mobuls left",
(long)((gtime+99)/100+1),(long)((TIMELIMIT-gtime)/100));
more();
nosignal=sigsav;
}
/*
* subroutine to clear screen depending on # lines to display
*/
t_setup(count)
register int count;
{
if (count<20) {
cl_up(79,count);
cursor(1,1);
}
else {
resetscroll();
clear();
}
}
/*
* subroutine to restore normal display screen depending on t_setup()
*/
t_endup(count)
register int count;
{
if (count<18) /* how did we clear the screen? */
draws(0,MAXX,0,(count>MAXY) ? MAXY : count);
else {
drawscreen();
setscroll();
}
}
/*
function to show the things player is wearing only
*/
showwear()
{
register int i,j,sigsav,count;
sigsav=nosignal;
nosignal=1; /* don't allow ^c etc */
srcount=0;
/* count number of items we will display */
for (count=2,j=0; j<=26; j++)
if (i=iven[j])
switch(i) {
case OLEATHER:
case OPLATE:
case OCHAIN:
case ORING:
case OSTUDLEATHER:
case OSPLINT:
case OPLATEARMOR:
case OSSPLATE:
case OSHIELD:
case OELVENCHAIN:
count++;
};
t_setup(count);
for (i=22; i<93; i++)
for (j=0; j<=26; j++)
if (i==iven[j])
switch(i) {
case OLEATHER:
case OPLATE:
case OCHAIN:
case ORING:
case OSTUDLEATHER:
case OSPLINT:
case OPLATEARMOR:
case OSSPLATE:
case OSHIELD:
case OELVENCHAIN:
show3(j);
};
more();
nosignal=sigsav;
t_endup(count);
}
/*
function to show the things player can wield only
*/
showwield()
{
register int i,j,sigsav,count;
sigsav=nosignal; nosignal=1; /* don't allow ^c etc */
srcount=0;
for (count=2,j=0; j<=26; j++) /* count how many items */
if (i=iven[j])
switch(i) {
case ODIAMOND: case ORUBY: case OEMERALD:
case OSAPPHIRE:
case OBOOK: case OCHEST: case OLARNEYE:
case ONOTHEFT:
case OSPIRITSCARAB: case OCUBEofUNDEAD:
case OPOTION:
case OORB:
case OHANDofFEAR:
case OBRASSLAMP:
case OURN:
case OWWAND:
case OSPHTALISMAN:
case OSCROLL: break;
default: count++;
};
t_setup(count);
for (i=22; i<93; i++)
for (j=0; j<=26; j++)
if (i==iven[j])
switch(i) {
case ODIAMOND: case ORUBY:
case OEMERALD: case OSAPPHIRE:
case OBOOK: case OCHEST:
case OLARNEYE: case ONOTHEFT:
case OSPIRITSCARAB: case OCUBEofUNDEAD:
case OPOTION: case OHANDofFEAR:
case OBRASSLAMP: case OURN:
case OSPHTALISMAN:
case OWWAND:
case OORB: case OSCROLL: break;
default: show3(j);
};
more();
nosignal=sigsav;
t_endup(count);
}
/*
* function to show the things player can read only
*/
showread()
{
register int i,j,sigsav,count;
sigsav=nosignal; nosignal=1; /* don't allow ^c etc */
srcount=0;
for (count=2,j=0; j<=26; j++)
switch(iven[j]) {
case OBOOK:
case OSCROLL:
count++;
};
t_setup(count);
for (i=22; i<84; i++)
for (j=0; j<=26; j++)
if (i==iven[j])
switch(i) {
case OBOOK:
case OSCROLL:
show3(j);
};
more();
nosignal=sigsav;
t_endup(count);
}
/*
* function to show the things player can eat only
*/
showeat()
{
register int i,j,sigsav,count;
sigsav=nosignal;
nosignal=1; /* don't allow ^c etc */
srcount=0;
for (count=2,j=0; j<=26; j++)
switch(iven[j]) {
case OCOOKIE:
count++;
};
t_setup(count);
for (i=22; i<84; i++)
for (j=0; j<=26; j++)
if (i==iven[j])
switch(i) {
case OCOOKIE:
show3(j);
};
more();
nosignal=sigsav;
t_endup(count);
}
/*
function to show the things player can quaff only
*/
showquaff()
{
register int i,j,sigsav,count;
sigsav=nosignal;
nosignal=1; /* don't allow ^c etc */
srcount=0;
for (count=2,j=0; j<=26; j++)
switch(iven[j]) {
case OPOTION:
count++;
};
t_setup(count);
for (i=22; i<84; i++)
for (j=0; j<=26; j++)
if (i==iven[j])
switch(i) {
case OPOTION:
show3(j);
};
more();
nosignal=sigsav;
t_endup(count);
}
show1(idx,str2)
register int idx;
register char *str2[];
{
if (str2==0)
lprintf("\n%c) %s",idx+'a',objectname[iven[idx]]);
else if (*str2[ivenarg[idx]]==0)
lprintf("\n%c) %s",idx+'a',objectname[iven[idx]]);
else
lprintf("\n%c) %s of%s",
idx+'a',objectname[iven[idx]],str2[ivenarg[idx]]);
}
show3(index)
register int index;
{
switch(iven[index]) {
case OPOTION: show1(index,potionname); break;
case OSCROLL: show1(index,scrollname); break;
case OLARNEYE:
case OBOOK:
case OSPIRITSCARAB:
case ODIAMOND:
case ORUBY:
case OCUBEofUNDEAD:
case OEMERALD:
case OCHEST:
case OCOOKIE:
case OSAPPHIRE:
case OORB:
case OHANDofFEAR:
case OBRASSLAMP:
case OURN:
case OWWAND:
case OSPHTALISMAN:
case ONOTHEFT: show1(index,(char **)0); break;
default:
lprintf("\n%c) %s",index+'a',objectname[iven[index]]);
if (ivenarg[index]>0)
lprintf(" + %d",(long)ivenarg[index]);
else if (ivenarg[index]<0)
lprintf(" %d",(long)ivenarg[index]);
break;
}
if (c[WIELD]==index)
lprcat(" (weapon in hand)");
if ((c[WEAR]==index) || (c[SHIELD]==index))
lprcat(" (being worn)");
if (++srcount>=22) {
srcount=0;
more();
clear();
}
}
/*
subroutine to randomly create monsters if needed
*/
randmonst()
{ /* don't make monsters if time is stopped */
if (c[TIMESTOP]) return;
if (--rmst <= 0) {
rmst = 120 - (level<<2);
fillmonst(makemonst(level));
}
}
/*
parse()
get and execute a command
*/
parse()
{
register int i,j,k,flag;
while (1) {
k = yylex();
/* get the token from the input and switch on it */
switch(k) {
case 'A': if (wizard)
diag();
yrepcount=0;
return;
case 'h': moveplayer(4);
return; /* west */
case 'H': run(4);
return; /* west */
case 'l': moveplayer(2);
return; /* east */
case 'L': run(2);
return; /* east */
case 'j': moveplayer(1);
return; /* south */
case 'J': run(1);
return; /* south */
case 'k': moveplayer(3);
return; /* north */
case 'K': run(3);
return; /* north */
case 'u': moveplayer(5);
return; /* northeast */
case 'U': run(5);
return; /* northeast */
case 'y': moveplayer(6);
return; /* northwest */
case 'Y': run(6);
return; /* northwest */
case 'n': moveplayer(7);
return; /* southeast */
case 'N': run(7);
return; /* southeast */
case 'b': moveplayer(8);
return; /* southwest */
case 'B': run(8);
return; /* southwest */
case '.': if (yrepcount)
viewflag=1;
return; /* stay here */
case 'w': yrepcount=0;
wield();
return; /* wield a weapon */
case 'W': yrepcount=0;
wear();
return; /* wear armor */
case 'r': yrepcount=0;
if (c[BLINDCOUNT]) {
cursors();
lprcat("\nYou can't read anything when you're blind!");
} else if (c[TIMESTOP]==0)
readscr();
return; /* to read a scroll */
case 'q': yrepcount=0;
if (c[TIMESTOP]==0)
quaff();
return; /* quaff a potion */
case 'd': yrepcount=0;
if (c[TIMESTOP]==0)
dropobj();
return; /* to drop an object */
case 'c': yrepcount=0;
cast();
return; /* cast a spell */
case 'i': yrepcount=0;
nomove=1;
showstr();
return; /* status */
case 'e': yrepcount=0;
if (c[TIMESTOP]==0)
eatcookie();
return; /* to eat a fortune cookie */
case 'D': yrepcount=0;
seemagic(0);
nomove=1;
return; /*list spells and scrolls */
case '?': yrepcount=0;
help();
nomove=1;
return; /*give the help screen*/
case 'S': clear();
lprcat("Saving . . .");
lflush();
savegame(savefilename);
wizard=1;
died(-257);
/* save the game -
doesn't return */
case 'Z': yrepcount=0;
if (wizard) {
int t;
cursors();
lprcat("\nWhich level do you wish to teleport to? ");
t = readnum(20);
if (t > 20 || t < 0) {
lprcat(" sorry!");
return;
}
playerx = rnd(MAXX-2);
playery = rnd(MAXY-2);
newcavelevel(t);
positionplayer();
draws(0,MAXX,0,MAXY);
bot_linex();
return;
}
if (c[LEVEL]>9) {
oteleport(1);
return;
}
cursors();
lprcat("\nYou don't know how to teleport yet");
return; /* teleport yourself */
case '^': /* identify traps */
flag=yrepcount=0;
cursors();
lprc('\n');
for (j=playery-1; j<playery+2; j++) {
if (j < 0) j=0;
if (j >= MAXY) break;
for (i=playerx-1; i<playerx+2; i++) {
if (i < 0) i=0;
if (i >= MAXX) break;
switch(item[i][j]) {
case OTRAPDOOR:
case ODARTRAP:
case OTRAPARROW:
case OTELEPORTER:
case OELEVATORUP:
case OELEVATORDOWN:
lprcat("\nIt's ");
lprcat(objectname[item[i][j]]);
flag++;
};
}
}
if (flag==0)
lprcat("\nNo traps are visible");
return;
case '#':
yrepcount=0;
cursors();
nomove=1;
if (getpassword()==0) {
scbr();
return;
}
scbr();
raiseexperience(370 * 1000000);
bottomline();
drawscreen();
return;
#if WIZID
case '_': /*this is the fudge player password
for wizard mode*/
yrepcount=0;
cursors();
nomove=1;
if (getpassword()==0) {
scbr();
return;
}
wizard=1;
scbr();
for (i=0; i<6; i++)
c[i]=70;
iven[0]=iven[1]=0;
take(OPROTRING,50);
take(OLANCE,25);
for (i=0; i<26; i++)
if (iven[i]==OLANCE && ivenarg[i]==25) {
c[WIELD]=i;
break;
}
c[LANCEDEATH]=1;
c[WEAR] = c[SHIELD] = -1;
raiseexperience(370*1000000);
c[AWARENESS] += 25000;
{
register int i,j;
for (i=0; i<MAXY; i++)
for (j=0; j<MAXX; j++)
know[j][i]=1;
for (i=0; i<SPNUM; i++)
spelknow[i]=1;
for (i=0; i<MAXSCROLL; i++)
scrollname[i][0]=' ';
for (i=0; i<MAXPOTION; i++)
potionname[i][0]=' ';
}
for (i=0; i<MAXSCROLL; i++)
if (strlen(scrollname[i])>2)
{ item[i][0]=OSCROLL;
iarg[i][0]=i;
}
for (i=MAXX-1; i>MAXX-1-MAXPOTION; i--)
if (strlen(potionname[i-MAXX+MAXPOTION])>2)
/* no null items */
{ item[i][0]=OPOTION;
iarg[i][0]=i-MAXX+MAXPOTION;
}
for (i=1; i<MAXY; i++)
{ item[0][i]=i;
iarg[0][i]=0;
}
for (i=MAXY; i<MAXY+MAXX; i++)
{ item[i-MAXY][MAXY-1]=i;
iarg[i-MAXY][MAXY-1]=0;
}
for (i=MAXX+MAXY; i<MAXX+MAXY+MAXY; i++)
{ item[MAXX-1][i-MAXX-MAXY]=i;
iarg[MAXX-1][i-MAXX-MAXY]=0;
}
c[GOLD]+=250000;
bottomline();
drawscreen();
return;
#endif /* WIZID */
case 'T': yrepcount=0;
cursors();
if (c[SHIELD] != -1) {
c[SHIELD] = -1;
lprcat("\nYour shield is off");
bottomline();
} else
if (c[WEAR] != -1) {
c[WEAR] = -1;
lprcat("\nYour armor is off");
bottomline();
}
else lprcat("\nYou aren't wearing anything");
return;
case 'g': cursors();
lprintf("\nThe stuff you are carrying presently weighs %d pounds",
(long)packweight());
case ' ': yrepcount=0;
nomove=1;
return;
case 'v': yrepcount=0;
cursors();
lprintf( "\nThe Addiction of Ularn, by Satyr. Difficulty : %d",
(long)c[HARDGAME]);
if (wizard) lprcat(" (WIZARD)");
nomove=1;
if (cheat) lprcat(" (Cheater)");
lprcat(copyright);
return;
case 'Q': yrepcount=0;
quit();
nomove=1;
return; /* quit */
case 'L'-64: yrepcount=0;
drawscreen();
nomove=1;
return; /* look */
case 'P': cursors();
if (outstanding_taxes>0)
lprintf("\nYou presently owe %d gp in taxes.",(long)outstanding_taxes);
else
lprcat("\nYou do not owe any taxes.");
return;
};
}
}
parse2()
{
if (c[HASTEMONST])
movemonst();
movemonst(); /* move the monsters */
randmonst();
regen();
}
run(dir)
int dir;
{
register int i;
i=1;
while (i) {
i=moveplayer(dir);
if (i>0) {
if (c[HASTEMONST])
movemonst();
movemonst();
randmonst();
regen();
}
if (hitflag) i=0;
if (i!=0)
showcell(playerx,playery);
}
}
/*
function to wield a weapon
*/
wield()
{
register int i;
while (1) {
if ((i = whatitem("wield"))=='\33') return;
if (i != '.') {
if (i=='*') showwield();
else if (iven[i-'a']==0) { ydhi(i); return; }
else if (iven[i-'a']==OPOTION) { ycwi(i); return; }
else if (iven[i-'a']==OSCROLL) { ycwi(i); return; }
else if ((c[SHIELD]!= -1) && (iven[i-'a']==O2SWORD)) {
lprcat("\nBut one arm is busy with your shield!");
return;
}
else {
c[WIELD]=i-'a';
if (iven[i-'a'] == OLANCE) c[LANCEDEATH]=1;
else c[LANCEDEATH]=0;
bottomline();
return;
}
}
}
}
/*
common routine to say you don't have an item
*/
ydhi(x)
int x;
{ cursors(); lprintf("\nYou don't have item %c!",x); }
ycwi(x)
int x;
{ cursors(); lprintf("\nYou can't wield item %c!",x); }
/*
function to wear armor
*/
wear()
{
register int i;
while (1) {
if ((i = whatitem("wear"))=='\33') return;
if (i != '.') {
if (i=='*') showwear(); else
switch(iven[i-'a']) {
case 0: ydhi(i); return;
case OLEATHER:
case OCHAIN:
case OPLATE:
case OSTUDLEATHER:
case ORING:
case OSPLINT:
case OPLATEARMOR:
case OELVENCHAIN:
case OSSPLATE:
if (c[WEAR] != -1) {
lprcat("\nYou're already wearing some armor");
return; }
c[WEAR]=i-'a';
bottomline();
return;
case OSHIELD:
if (c[SHIELD] != -1) {
lprcat("\nYou are already wearing a shield");
return;
}
if (iven[c[WIELD]]==O2SWORD) {
lprcat("\nYour hands are busy with the two handed sword!");
return;
}
c[SHIELD] = i-'a'; bottomline(); return;
default: lprcat("\nYou can't wear that!");
};
}
}
}
/*
function to drop an object
*/
dropobj()
{
register int i;
register char *p;
long amt;
p = &item[playerx][playery];
while (1) {
if ((i = whatitem("drop"))=='\33') return;
if (i=='*')
showstr();
else {
/* drop some gold */
if (i=='.') {
if (*p) {
lprcat("\nThere's something here already!");
return;
}
lprcat("\n\n");
cl_dn(1,23);
lprcat("How much gold do you drop? ");
if ((amt=readnum((long)c[GOLD])) == 0) return;
if (amt>c[GOLD]) {
lprcat("\nYou don't have that much!");
return;
}
if (amt<=32767) {
*p=OGOLDPILE;
i=amt;
}
else if (amt<=327670L) {
*p=ODGOLD;
i=amt/10;
amt = 10*i;
}
else if (amt<=3276700L) {
*p=OMAXGOLD;
i=amt/100;
amt = 100*i;
}
else if (amt<=32767000L) {
*p=OKGOLD;
i=amt/1000;
amt = 1000*i;
}
else {
*p=OKGOLD;
i=32767;
amt = 32767000L;
}
c[GOLD] -= amt;
lprintf("You drop %d gold pieces",(long)amt);
iarg[playerx][playery]=i;
bottomgold();
know[playerx][playery]=0;
dropflag=1;
return;
}
drop_object(i-'a');
return;
}
}
}
/*
* readscr() Subroutine to read a scroll one is carrying
*/
readscr()
{
register int i;
while (1) {
if ((i = whatitem("read"))=='\33') return;
if (i != '.') {
if (i=='*') showread(); else {
if (iven[i-'a']==OSCROLL) { read_scroll(ivenarg[i-'a']); iven[i-'a']=0; return; }
if (iven[i-'a']==OBOOK) { readbook(ivenarg[i-'a']); iven[i-'a']=0; return; }
if (iven[i-'a']==0) { ydhi(i); return; }
lprcat("\nThere's nothing on it to read"); return;
}
}
}
}
/*
* subroutine to eat a cookie one is carrying
*/
eatcookie()
{
register int i;
char *p;
while (1) {
if ((i = whatitem("eat"))=='\33')
return;
if (i != '.')
if (i=='*') showeat(); else {
if (iven[i-'a']==OCOOKIE) {
lprcat("\nThe cookie was delicious.");
iven[i-'a']=0;
if (!c[BLINDCOUNT]) {
if (p=fortune(fortfile)) {
lprcat(" Inside you find a scrap of paper that says:\n");
lprcat(p);
}
}
return;
}
if (iven[i-'a']==0) { ydhi(i); return; }
lprcat("\nYou can't eat that!"); return;
}
}
}
/*
* subroutine to quaff a potion one is carrying
*/
quaff()
{
register int i;
while (1) {
if ((i = qwhatitem())=='\33') return;
if (i != '.') {
if (i=='*') showquaff();
else {
if (iven[i-'a']==OPOTION) {
quaffpotion(ivenarg[i-'a']);
iven[i-'a']=0;
return;
}
if (iven[i-'a']==0) { ydhi(i); return; }
lprcat("\nYou wouldn't want to quaff that, would you? ");
return;
}
}
}
}
qwhatitem()
{
int j, i=0;
char gack[26];
cursors();
for (j=0; j<=26; j++)
switch(iven[j]) {
case OPOTION: gack[i++] = j;
};
lprintf("\nWhat do you want to quaff [");
if (i)
for (j=0;j<i;j++)
lprintf("%c",gack[j] + 'a');
lprintf(" * for all] ?");
i=0;
while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.'))
i=getcharacter();
if (i=='\33')
lprcat(" aborted");
return(i);
}
/*
function to ask what player wants to do
*/
whatitem(str)
char *str;
{
register int j=0, flag=0, i=0;
int wld=0, q=0, r=0, w=0, e=0, d=0;
char gack[26];
cursors();
if (!strcmp(str, "wield")) wld = 1;
else if (!strcmp(str, "quaff")) q = 1;
else if (!strcmp(str, "read")) r = 1;
else if (!strcmp(str, "wear")) w = 1;
else if (!strcmp(str, "eat")) e = 1;
else if (!strcmp(str, "drop")) d = 1;
for (j=0; j<=26; j++) {
switch(iven[j]) {
case OSWORDofSLASHING :
case OHAMMER:
case OSWORD:
case O2SWORD:
case OSPEAR :
case ODAGGER:
case OBATTLEAXE:
case OLONGSWORD:
case OFLAIL:
case OSLAYER :
case OLANCE :
flag = 1; break; /* wield */
case OPOTION:
flag = 2; break; /* quaff */
case OSCROLL:
flag = 3; break; /* read */
case OPLATE :
case OCHAIN:
case OLEATHER :
case ORING :
case OSTUDLEATHER :
case OSPLINT :
case OPLATEARMOR :
case OSSPLATE :
case OSHIELD :
case OELVENCHAIN :
flag = 4; break; /* wear */
case OCOOKIE:
flag = 5; break; /* eat */
default : flag = 0; break;
}
if (!d) switch (flag) {
case 0 : break;
case 1 : if (wld) gack[i++] = j;
break;
case 2 : if (q) gack[i++] = j;
break;
case 3 : if (r) gack[i++] = j;
break;
case 4 : if (w) gack[i++] = j;
break;
case 5 : if (e) gack[i++] = j;
default : break;
}
else if (iven[j]) gack[i++] = j;
}
lprintf("\nWhat do you want to %s [", str);
if (i) {
for (j=0;j<i;j++)
lprintf("%c",gack[j] + 'a');
lprintf(" ");
}
lprintf("* for all] ?");
i=0;
while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.'))
i=getcharacter();
if (i=='\33')
lprcat(" aborted");
return(i);
}
/*
subroutine to get a number from the player
and allow * to mean return amt, else return the number entered
*/
long readnum(mx)
long mx;
{
register int i;
long amt=0;
sncbr();
if ((i=getcharacter()) == '*')
amt = mx; /* allow him to say * for all gold */
else while (i != '\n') {
if (i=='\033') { scbr(); lprcat(" aborted"); return(0); }
if ((i <= '9') && (i >= '0') && (amt<999999999))
amt = amt*10+i-'0';
i = getcharacter();
}
scbr();
return(amt);
}